package Thread.demo7.Semaphore;

import java.util.concurrent.Semaphore;

/**
 * 例子： 一个店每次只有能10个人进去购买东西，则当购买完毕后，才能让排队的人进去购买
 * Semaphore:
 *      Semaphore(信号量)实际上就是可以控制同时访问的线程个数，它维护了一组"许可证"。
 *
 *      当调用acquire()方法时，会消费一个许可证。如果没有许可证了，会阻塞起来
 *      当调用release()方法时，会添加一个许可证。
 *      这些"许可证"的个数其实就是一个count变量罢了~
 * @author
 * @create 2018-10-10 13:04
 **/
public class SemaphoreTest {

    public static void main(String[] args) {

        //每次一个店只能容纳10个人来购买东西
        Semaphore semaphore = new Semaphore(10);

        int peopleNumber = 50;

        for (int i = 0; i < peopleNumber; i++) {
            int finallyNumber = i;
            new Thread(new Runnable() {
                @Override
                public void run() {

                    try {
                        //获取许可证
                        semaphore.acquire();
                        System.out.println("顾客" + finallyNumber + "正在购买");

                        //假设挑选东西需要花费时间
                        Thread.sleep(100);
                        System.out.println("顾客"+finallyNumber+"购买完毕");
                        //归回许可证
                        semaphore.release();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
            }).start();
        }
    }
}
